﻿using PhraseCorrector.Common;
using PhraseCorrector.DirectTanslate;
using PhraseCorrector.SimplePinyin;
using PhraseCorrector.SpellLook;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;

namespace PhraseCorrector.SpellCorrect
{

    /**
     * @brief 中文拼写检查类，用于处理中文拼写错误。
     * @details 该类提供了一系列方法，用于处理中文拼写错误，包括拼写检查、拼写纠正等。
     * @note 该类依赖Loadlibrary类进行字典加载，并使用SpellCompound类进行拼写检查。
     */
    public class ChineseSpell
    {

        #region 静态变量

        // //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 最大编辑距离，用于衡量字符串相似度
        /// 调入字库时使用。之后可在纠错时，动态调整该值
        /// </summary>
        /// <remarks>
        /// 此参数越大，占用内存越多，速度越慢，但是越敏感。
        /// 默认值是3，比较敏感，中文术语较英文相对较短，故中文纠错使用该值。
        /// </remarks>
        private static int MaxEditDistance { set; get; }= 4;

        // //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 拼写校正词汇前缀长度，用于加速查询
        /// </summary>
        private static int PrefixLength { set; get; }= 7;

        // //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 拼写处理属性，用于设置和获取拼写校正的复合对象。
        /// </summary>
        public static Spell _SpellHandle= null;

        // //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取SpellCompound的实例，用于处理拼写错误。
        /// </summary>
        /// <returns>SpellCompound的实例。</returns>
        /// <exception cref="Exception">如果实例化失败，则抛出异常。</exception>
        public static Spell SpellHandle
        {
            get
            {
                // 使用null合并运算符初始化_SpellHandle，如果未初始化，则调用CreateSpellHandle方法进行初始化
                _SpellHandle ??= CreateSpellHandle();

                // 检查_SpellHandle是否成功初始化，如果未成功，则抛出异常
                return _SpellHandle != null
                    ? _SpellHandle
                    : throw new Exception("字库转载失败.");
            }
        }

        // //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 创建SpellCompound的实例。
        /// </summary>
        /// <returns>SpellCompound的实例。</returns>
        private static Spell CreateSpellHandle()
        {
            // 使用Loadlibrary类初始化SpellCompound的实例
            return new Loadlibrary(BasePath.PhraseLibPath, MaxEditDistance, PrefixLength, PhraseType.Chinese).SpellHandle;
        }
        #endregion

        #region 构造函数

        // //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 创建一个中文拼写检查类的实例。
        /// </summary>
        public ChineseSpell()
        {
            // 懒加载SpellHandle实例，如果未初始化，则进行初始化。
            _SpellHandle ??= CreateSpellHandle();

            // 检查字典加载是否成功
            if (_SpellHandle.WordCount== 0)
                Logger.Log.Error($"中文频率字典{BasePath.PhraseLibPath}调入失败.");
        }
        #endregion


    }
}
